package com.example.supermarket.service.impl;

import com.example.supermarket.entity.Menu;
import com.example.supermarket.entity.Role;
import com.example.supermarket.exception.MenuReferenceException;
import com.example.supermarket.mapper.MenuMapper;
import com.example.supermarket.mapper.RoleMapper;
import com.example.supermarket.service.MenuService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ${author}
 * @since 2023-10-13
 */
@Service
public class MenuServiceImpl implements MenuService {
	@Autowired
	MenuMapper menuMapper;

	@Autowired
	RoleMapper roleMapper;

	/**
	 * 查询所有菜单
	 * @return
	 */
	@Override
	public List<Menu> getAllMenus() {
		//获取所有菜单的列表
		List<Menu> allMenus = menuMapper.selectAllMenus();
		// 创建一个用于存储最终结果的菜单列表
		List<Menu> menus = new ArrayList<>();
		// 遍历找出根节点菜单（pmid为0),将其加入到最终结果列表中,
		for (Menu menu : allMenus) {
			if (menu.getPmid().equals(0)) {
				menus.add(menu);
			}
		}
		// 递归构建菜单树
		buildMenuTree(allMenus, menus);
		//返回最终结果的菜单列表
		return menus;
	}

	/**
	 * 递归构建菜单树方法
	 * @param allMenus
	 * @param menus
	 */
	private void buildMenuTree(List<Menu> allMenus, List<Menu> menus) {
		//遍历每一个父级菜单
		for (Menu parentMenu : menus) {
			//创建一个临时列表用于存储当前父菜单的子菜单
			List<Menu> children = new ArrayList<>();
			//遍历所有菜单，寻找当前父菜单的子菜单并添加到临时列表中
			for (Menu menu : allMenus) {
				if (menu.getMid().equals(parentMenu.getMid())) {
					children.add(menu);
				}
			}
			// 如果当前父菜单有子菜单，则将子菜单列表设置给父菜单，并进行递归构建子菜单的子菜单
			if (!children.isEmpty()) {
				parentMenu.setChildren(children);
				//递归构建子菜单的子菜单
				buildMenuTree(allMenus, children);
			}
		}
	}

	/**
	 * 根据uid查询用户已拥有的菜单
	 * @param uid
	 * @return
	 */
	@Override
	public List<Menu> getMenusByUid(int uid) {
		//获取所有菜单的列表
		List<Menu> allMenus = menuMapper.getMenusByUid(uid);
		// 创建一个用于存储最终结果的菜单列表
		List<Menu> menus = new ArrayList<>();
		// 遍历找出根节点菜单（pmid为0),将其加入到最终结果列表中,
		for (Menu menu : allMenus) {
			if (menu.getPmid().equals(0)) {
				menus.add(menu);
			}
		}
		// 递归构建菜单树
		buildMenuTree(allMenus, menus);
		//返回最终结果的菜单列表
		return menus;
	}

	/**
	 * 添加
	 * @param menu
	 */
	@Override
	public void addMenus(Menu menu) {
		menuMapper.addMenus(menu);
	}

	/**
	 * 删除
	 * @param mid
	 */
	@Override
	public void removeMenuByMid(int mid) {
		//被引用的不能删除
		List<Role> roles = roleMapper.selectRolesByMid(mid);
		if (roles.size()!=0){
			throw new MenuReferenceException("菜单被使用,不能删除");
		}else {
			//TODD:执行删除
			menuMapper.removeMenuByMid(mid);
		}
	}
}
